package com.cskaoyan.javase.oop3._1interface._1basic;

/**
 * 接口的特点我们主要研究以下方面
 *      1.接口的声明特点
 *          a.接口是抽象的,它不能被创建对象
 *              接口的声明中默认就被"abstract"修饰符修饰
 *              默认的修饰符不要写出来,没必要
 *          b.接口的声明中同样不能有final
 *
 *      2.接口的实现类的书写格式(了解,某些程序员采取这种格式,不强制)
 *          接口的命名往往以"I"开头
 *          接口的实现类,为了表示它是某个接口的实现类,可以命名为"接口名 + Impl"
 *              并且,也可以将实现类,专门放在一个命名为"impl"的包下
 * 成员特点
 *
 *      3.主要看接口中能够定义的结构的特点:
 *          a.属性的定义
 *          接口不强调属性,只强调行为
 *                接口当中允许定义属性
 *               但是这些属性,默认都是"public static final"
 *               修饰的公共全局常量
 *               接口中的属性全部都是公共全局常量
 *               注意事项:
 *                  1.接口中的全局常量必须显式赋值,因为接口没有静态代码块
 *                  2.什么时候需要在接口中定义全局常量呢?
 *                      如果接口的所有实现类都需要某个全局常量,那么就可以定义全局常量(这种情况下在开发极其罕见,接口中定义属性属于极其罕见的操作)
 *                      绝大多数接口中都只有方法.
 *                  3.接口定义的目的就是为了被实现
 *                  所以为了体现这样的设计目的
 *                  接口中的所有允许定义的结构
 *                  访问权限全部都是public修饰,而且是隐含的,不可更改的!!
 *                  4.如果你非要定义接口中的全局常量
 *                      不要写出省略的修饰符
 *
 *          b.方法的定义
 *              接口中能够定义的方法,默认都是"public abstract"修饰的公共抽象方法
 *              默认的修饰符不要写出来
 *
 *              注:
 *                  Java8及其以后的版本中,接口允许定义实现方法了
 *                  也就是"默认方法"以及"静态方法"
 *                  实际上这种实现方法,在接口中定义是比较罕见的,我们仅做了解即可
 *
 *          c.构造器以及代码块
 *              接口不能创建对象,并且接口中只能定义全局常量
 *              所以接口中定义构造器毫无意义,没有作用
 *              接口是没有构造器,同时也没有构造代码块
 *              并且接口也没有静态代码块
 *
 * 于是,总结一下接口中能够定义的结构的特点:
 *      1.允许定义全局常量
 *      2.允许定义抽象方法
 *      3.(Java8之后)允许定义实现方法
 *      4.以上结构全部默认public修饰
 * 实际上,大多数接口都只有2.
 *
 * Java8中的默认方法和静态方法:
 * 第一种实现方法是默认方法,之所以叫默认方法,因为它真的对应关键字"default":
 *      // 默认方法的语法:
 *      default 返回值类型 方法名(形参列表){
 *          //方法体
 *      }
 *      接口中的默认方法,可以理解成接口中的成员方法,会被子类继承,不需要子类强制实现,可以被子类重写,调用的时候需要创建实现类对象.
 *
 * 静态方法,之所以叫静态方法,因为它的修饰符列表中存在static关键字
 *      // 静态方法的语法:
 *      static 返回值类型 方法名(形参列表){
 *            //方法体
 *      }
 *      接口中的静态方法,可以理解成类中的静态方法
 *      使用"接口名点"调用
 *      但需要注意: 接口的静态方法并不允许"实现类类名点"调用
 *
 * @since 16:10
 * @author wuguidong@cskaoyan.onaliyun.com
 */
// 一个用于测试的接口
public interface ITest {

    /*public static void main(String[] args) {
        System.out.println("66666666666");
    }*/
    // Variable 'a' might not have been initialized
    // Modifier 'final' is redundant for interface fields
    // Modifier 'static' is redundant for interface fields
    // Modifier 'public' is redundant for interface fields
    public final static int a = 10;

    // 接口中定义全局常量
    int NUM = 1;
    String NAME = "张三";

    // 接口中定义抽象方法
    void test();

    void test(int a);

    int test(double a);

    // 接口中的默认方法
    default void defaultMethod(){
        System.out.println("hello world!");
    }

    // 接口中定义静态方法
    static void staticMethod(){
        System.out.println("6666");
    }
}

// 实际上大多数情况下,我们能看到的接口中都只有抽象方法,都是以下格式
interface IA {
    void test();

    void test(int a);

    int test(double a);
}

// Modifier 'abstract' is redundant for interfaces
// public abstract interface Demo {
// }
